package com.hunttown.mes.manage.controller.filter;

import com.hunttown.mes.manage.service.LocalCheckLoginService;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 管理用户登录拦截器
 * 1、一个请求，get，post等方式，到后台，必须先经过filter，然后经过Interceptor，最后在通过在filter或者Interceptor里面的跳转，跳到指定的页面或者action或者servlet中。
 * 2、Interceptor只能拦截action请求，而filter是万能的，是请求就能拦截。
 * 3、filter是链式处理的，也就是一个filter过滤完后，如果还有过滤，那就得继续。顺序根据web.xml里面的顺序来。
 * created by wangjunfu on 2018-11-01
 */
public class LoginFilter implements Filter {

    // web 加载顺序：启动-->listener-->filter-->servlet--->访问-->filter-->servlet-->关闭-->servlet--->filter-->listener。
    // 在spring对对应的bean进行扫描的时候，filter还没有执行初始化，filter的加载是在listener之后，所以通过@Autowired 加载不到。
    // 因此只能在init中实现
    private LocalCheckLoginService checkLoginService;

    public void init(FilterConfig filterConfig) throws ServletException {
        ServletContext servletContext = filterConfig.getServletContext();
        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        this.checkLoginService = wac.getBean(LocalCheckLoginService.class);
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String uri = request.getRequestURI().toLowerCase();

        // 不拦截：登录、获取验证码、退出
        if (uri.contains("/logon") || uri.contains("/login") || uri.contains("/signin")) {
            // 将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        // 不拦截：静态资源文件和ajax请求
        if (uri.contains("/static/") || uri.contains("/ajax/")) {
            // 将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        // 不拦截：主页不拦截
        if (uri.equals("/topbar") || uri.equals("/side_menu")) {
            // 将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        // 不拦截：佳华商场项目的主页
        if (uri.contains("/main") || uri.equals("/getEquipmentTemperature".toLowerCase())) {
            // 将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        // 不拦截：隐私政策
        if (uri.equals("/home/appservice")) {
            // 将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        // 不拦截：本地文件访问
        if (uri.contains("/files/cos")) {
            // 将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        //region //登录拦截
        //1、黑名单是否是锁定时间内
        //2、Cookie 是否存在
        //3、Session/缓存是否存在
        //4、验证 Session 是否被篡改

        boolean is_login = checkLoginService.checkLogin(request, response);
        if (!is_login) {
            response.sendRedirect("/logon");     //帐号登录跳转[/login]；验证码登录跳转[/signin]
            return;
        }

        //endregion

        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {

    }
}
